package com.yuw.action;

import com.alibaba.druid.support.json.JSONParser;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.yuw.bean.AdminInfoBean;
import com.yuw.myUtils.MyUtils;
import com.yuw.service.IAdminInfoService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import java.util.List;

/**
 * 使用@Controller注解，使得SpringMVC框架能够扫描该类作为Control层
 */
@Controller
public class AdminInfoAction {

    /*
     使用注解获取Mybatis框架的Mapper接口的实现类的实例对象
     此处使用了spring框架的IOC和DI
     也使用了面向接口的编程软件原则
     */
    @Autowired  // 此处pring进行依赖注入时，使用的是按类型进行依赖注入
    private IAdminInfoService adminInfoService;


    /**
     * 文件上传处理：基于request对象进行文件上传处理
     *
     * @param adminInfoBean 接收表单数据的实体类参数
     * @return 跳转的视图名
     */
    @RequestMapping("/saveAdminInfo")
    public String saveAdminInfo(AdminInfoBean adminInfoBean, HttpServletRequest request) {
        System.out.println("当前登录用户:" + adminInfoBean.toString());
        // 调用Service进行查询操作
        List<AdminInfoBean> lstAdminInfos = adminInfoService.selectAdminInfoByParams(new AdminInfoBean());
        // 文件上传处理：方法一：从request对象中提取文件流对象进行文件上传保存（可以参照Servlet框架中的处理方式）
        // TODO 可以参照Servlet框架中的处理方式,进行文件伤处处理
        // 缓存查询结果信息
        request.getSession().setAttribute("lstUserInfos", lstAdminInfos);
        // 跳转到结果显示页面
        return "userInfo/UserInfoAddDetail";
    }

    /**
     * 文件上传处理：基于MultipartFile对象进行文件上传处理；
     * 也就是，form表单中的一个file类型的控件，在SpringMVC的框架中会被HandlerAdaptor 转换为一个MultipartFile 对象
     * 然后，使用流程操作，将MultipartFile对象进行上传操作即可
     *
     * @param adminInfoBean 接收表单数据的实体类参数
     * @return 跳转的视图名
     */
    @RequestMapping("/saveAdminInfo2")
    public String saveAdminInfo2(AdminInfoBean adminInfoBean, HttpServletRequest request, @RequestParam("file_adminimg") MultipartFile file_adminimg) {
        System.out.println("当前登录用户:" + adminInfoBean.toString());
        // 调用Service进行查询操作
        List<AdminInfoBean> lstAdminInfos = adminInfoService.selectAdminInfoByParams(new AdminInfoBean());
        // 文件上传处理：方法一：从request对象中提取文件流对象进行文件上传保存（可以参照Servlet框架中的处理方式）
        // 进行文件上传操作
        MyUtils.uploadFileByMultipartFile(request, adminInfoBean, file_adminimg, "adminImgs", "adminImg");
        // TODO 进行保存处理
        System.out.println("文件上传之后的实体类参数：" + adminInfoBean.toString());
        // 缓存查询结果信息
        request.getSession().setAttribute("lstUserInfos", lstAdminInfos);
        // 跳转到结果显示页面
        return "userInfo/UserInfoAddDetail";
    }

    /**
     * 使用ResponseEntity返回该类的实例对象，将结果集和http状态信息以构造参数的形式进行封装到ResponseEntity对象中，返回该对象即可
     *
     * @param adminInfoBean
     * @return
     */
    @RequestMapping("adminInfoAjaxQueryingAction2")
    public ResponseEntity<List<AdminInfoBean>> doAjaxQueryAdminInfoByParams2(AdminInfoBean adminInfoBean) {

        // 打印查询参数实体类
        System.out.println("查询参数：" + adminInfoBean.toString());
        // 调用service方法进行查询业务逻辑处理
        List<AdminInfoBean> lstAdminInfos = adminInfoService.selectAdminInfoByParams(adminInfoBean);

        // 将返回的结果集数据和Http状态信息，存入ResponseEntity对象中
        ResponseEntity<List<AdminInfoBean>> responseEntity = new ResponseEntity<List<AdminInfoBean>>(lstAdminInfos, HttpStatus.OK);

        // 返回结果值
        return responseEntity;
    }


    /**
     * 使用@ResponseBody注解用于将action响应方法返回的数据结构转换为json字符串
     *
     * @param adminInfoBean
     * @return
     */
    @ResponseBody
    @RequestMapping("adminInfoAjaxQueryingAction")
    public List<AdminInfoBean> doAjaxQueryAdminInfoByParams(AdminInfoBean adminInfoBean) {

        // 打印查询参数实体类
        System.out.println("查询参数：" + adminInfoBean.toString());
        // 调用service方法进行查询业务逻辑处理
        List<AdminInfoBean> lstAdminInfos = adminInfoService.selectAdminInfoByParams(adminInfoBean);
        // 返回结果值
        return lstAdminInfos;
    }


    @RequestMapping("adminInfoQueryingAction")
    public ModelAndView doQueryAdminInfoByParams(AdminInfoBean adminInfoBean) {
        // 默认返回的ModelAndView对象
        ModelAndView mav = new ModelAndView();
        // 设置缓存，类似于使用session、request缓存对象
        // 设置跳转页面路径地址
        // 挑战到查询页面进行结果显示
        mav.setViewName("userInfo/UserInfoQuery");
        // 打印查询参数实体类
        System.out.println("查询参数：" + adminInfoBean.toString());
        // 调用service方法进行查询业务逻辑处理
        List<AdminInfoBean> lstAdminInfos = adminInfoService.selectAdminInfoByParams(adminInfoBean);
        // 将查询结果缓存到ModelAndView对象
        mav.addObject("lstQueryUserInfos", lstAdminInfos);
        return mav;
    }


    /**
     * 登录请求的响应处理
     *
     * @param adminInfoBean 接收表单数据的实体类参数
     * @return 跳转的视图名
     */
    @RequestMapping("/doLogin")
    public String doLogin(AdminInfoBean adminInfoBean) {
        System.out.println("当前登录用户:" + adminInfoBean.toString());
        // 调用Service进行业务逻辑处理
        List<AdminInfoBean> lstAdminInfos = adminInfoService.queryLoginInfo(adminInfoBean);

        if (lstAdminInfos != null && lstAdminInfos.size() > 0) {
            // 使用重定向或者转发跳转到登录成功页面
            // 缓存登录成功之后的信息

            // 转发到登录成功页面
            // 原始的跳转路径名为：WEB-INF/pages/logined.jsp
            // 因为SpringMVC配置了视图解析器的前缀和后缀，所有只需要返回结果页路径的前缀和后缀之后，剩余的内容
            return "logined";
            // 使用重定向:重定向不能直接访问web项目的WEB-INF目录
            // response.sendRedirect("WEB-INF/logined.jsp");
            /*
             * web项目的WEB-INF目录是站点安全目录；只能通过转发才能访问其中的资源文件；
             */
        } else {
            // 重定向到登录页面继续登录，因为登录页面没有在web-info目录下，所有使用重定向和转发都可以访问
            return "../../index";
        }
    }


    /**
     * 登录请求的响应处理
     *
     * @param adminInfoBean 接收表单数据的实体类参数
     * @return 跳转的视图名
     */
    @RequestMapping("/doLogin2")
    public ModelAndView doLogin2(AdminInfoBean adminInfoBean) {

        // 默认返回的ModelAndView对象
        ModelAndView mav = new ModelAndView();
        // 设置缓存，类似于使用session、request缓存对象
        // 设置跳转页面路径地址
        // 默认跳转地址：登录失败之后的重新进入登录页面
        mav.setViewName("../../index");

        System.out.println("当前登录用户:" + adminInfoBean.toString());
        // 调用Service进行业务逻辑处理
        List<AdminInfoBean> lstAdminInfos = adminInfoService.queryLoginInfo(adminInfoBean);

        if (lstAdminInfos != null && lstAdminInfos.size() > 0) {
            // 使用重定向或者转发跳转到登录成功页面
            // 缓存登录成功之后的信息

            // ModelAndView数据缓存级别是Request级别
            mav.addObject("loginUserInfoB", lstAdminInfos.get(0));
            // 转发到登录成功页面
            mav.setViewName("logined");
        }

        // 返回值
        return mav;
    }

    /**
     * 登录请求的响应处理
     *
     * @param adminInfoBean 接收表单数据的实体类参数
     * @return 跳转的视图名
     */
    @RequestMapping("/doLogin3")
    public String doLogin3(AdminInfoBean adminInfoBean, HttpServletRequest request) {
        /*****************************************************************
         *
         * 因为使用了HTTPServletRequest对象，所以需要进行一下处理：
         * 1、在项目属性Project Structure--Modules--Dependencies添加tomcat的引用；
         * 2、为了maven的Install操作成功，需要在windows的文件目录中，将tomcat中的lib目录中的servlet-api.jar
         * 文件拷贝到windows中jdk的安装目录下：C:\Program Files\Java\jdk1.8.0_201\jre\lib\ext
         * （注意是jdk下的jre的目录）
         *
         * 3、SpringMVC获取servlet对象request、session的方式有：
         * https://www.cnblogs.com/wudb/archive/2017/08/31/7458856.html
         *
         */

        System.out.println("当前登录用户:" + adminInfoBean.toString());
        // 调用Service进行业务逻辑处理
        List<AdminInfoBean> lstAdminInfos = adminInfoService.queryLoginInfo(adminInfoBean);

        if (lstAdminInfos != null && lstAdminInfos.size() > 0) {
            // 使用重定向或者转发跳转到登录成功页面
            // 缓存登录成功之后的信息
            request.getSession().setAttribute("loginUserInfoB", lstAdminInfos.get(0));
            // 转发到登录成功页面
            // 原始的跳转路径名为：WEB-INF/pages/logined.jsp
            // 因为SpringMVC配置了视图解析器的前缀和后缀，所有只需要返回结果页路径的前缀和后缀之后，剩余的内容
            return "logined";

        } else {
            // 重定向到登录页面继续登录，因为登录页面没有在web-info目录下，所有使用重定向和转发都可以访问
            return "../../index";
        }
    }


    /**
     * @param adminname
     * @param adminpsw
     * @param request
     * @return
     */
    @RequestMapping("/doLogin4")
    public String doLogin4(String adminname, String adminpsw, HttpServletRequest request) {
        /*****************************************************************
         *
         * 因为使用了HTTPServletRequest对象，所以需要进行一下处理：
         * 1、在项目属性Project Structure--Modules--Dependencies添加tomcat的引用；
         * 2、为了maven的Install操作成功，需要在windows的文件目录中，将tomcat中的lib目录中的servlet-api.jar
         * 文件拷贝到windows中jdk的安装目录下：C:\Program Files\Java\jdk1.8.0_201\jre\lib\ext
         * （注意是jdk下的jre的目录）
         *
         * 3、SpringMVC获取servlet对象request、session的方式有：
         * https://www.cnblogs.com/wudb/archive/2017/08/31/7458856.html
         *
         */

        System.out.println("当前登录用户:" + adminname);
        // 创建一个实体类对象，用于传递参数
        AdminInfoBean adminInfoBean = new AdminInfoBean();
        adminInfoBean.setAdminname(adminname);
        adminInfoBean.setAdminpsw(adminpsw);

        // 调用Service进行业务逻辑处理
        List<AdminInfoBean> lstAdminInfos = adminInfoService.queryLoginInfo(adminInfoBean);

        if (lstAdminInfos != null && lstAdminInfos.size() > 0) {
            // 使用重定向或者转发跳转到登录成功页面
            // 缓存登录成功之后的信息
            request.getSession().setAttribute("loginUserInfoB", lstAdminInfos.get(0));
            // 转发到登录成功页面
            // 原始的跳转路径名为：WEB-INF/pages/logined.jsp
            // 因为SpringMVC配置了视图解析器的前缀和后缀，所有只需要返回结果页路径的前缀和后缀之后，剩余的内容
            return "logined";

        } else {
            // 重定向到登录页面继续登录，因为登录页面没有在web-info目录下，所有使用重定向和转发都可以访问
            return "../../index";
        }
    }


    /**
     * @param strAdminname
     * @param atrAdminpsw
     * @param request
     * @return
     */
    @RequestMapping("/doLogin5")
    public String doLogin5(@RequestParam("adminname") String strAdminname, @RequestParam("adminpsw") String atrAdminpsw, HttpServletRequest request) {
        /*****************************************************************
         *
         * 因为使用了HTTPServletRequest对象，所以需要进行一下处理：
         * 1、在项目属性Project Structure--Modules--Dependencies添加tomcat的引用；
         * 2、为了maven的Install操作成功，需要在windows的文件目录中，将tomcat中的lib目录中的servlet-api.jar
         * 文件拷贝到windows中jdk的安装目录下：C:\Program Files\Java\jdk1.8.0_201\jre\lib\ext
         * （注意是jdk下的jre的目录）
         *
         * 3、SpringMVC获取servlet对象request、session的方式有：
         * https://www.cnblogs.com/wudb/archive/2017/08/31/7458856.html
         *
         */

        System.out.println("当前登录用户:" + strAdminname);
        // 创建一个实体类对象，用于传递参数
        AdminInfoBean adminInfoBean = new AdminInfoBean();
        adminInfoBean.setAdminname(strAdminname);
        adminInfoBean.setAdminpsw(atrAdminpsw);

        // 调用Service进行业务逻辑处理
        List<AdminInfoBean> lstAdminInfos = adminInfoService.queryLoginInfo(adminInfoBean);

        if (lstAdminInfos != null && lstAdminInfos.size() > 0) {
            // 使用重定向或者转发跳转到登录成功页面
            // 缓存登录成功之后的信息
            request.getSession().setAttribute("loginUserInfoB", lstAdminInfos.get(0));
            // 转发到登录成功页面
            // 原始的跳转路径名为：WEB-INF/pages/logined.jsp
            // 因为SpringMVC配置了视图解析器的前缀和后缀，所有只需要返回结果页路径的前缀和后缀之后，剩余的内容
            return "pages/logined";

        } else {
            // 重定向到登录页面继续登录，因为登录页面没有在web-info目录下，所有使用重定向和转发都可以访问
            return "index/index";
        }
    }
}
